import axios from 'axios'
import config from '@/config'
import ViewUI from 'view-design'
import ErrorCode from '@/http/errorCode'

/**
 * 请求参数配置
 */
const getConfig = () => {
  return {
    // 请求地址
    baseURL: process.env.NODE_ENV === 'production' ? config.baseUrl.pro : config.baseUrl.dev,
    // 请求超时时间
    timeout: config.timeout,
    // 请求头配置
    headers: config.headers
  }
}

/**
 * @description axios请求实例
 */
const instance = axios.create(getConfig())

/**
 * @description 请求前拦截
 */
instance.interceptors.request.use(config => {
  //当前未设置任何拦截
  return config
}, error => {
  return Promise.reject(error)
})

/**
 * @description 请求响应拦截
 */
instance.interceptors.response.use(res => {
  // 打印请求结果
  printLog('res',res)

  const { data, status } = res
  if(status === 200){
    // 状态码200，表示服务能访问正常，非业务状态
    if(!data.status){
      // 当前状态表示业务执行失败，进行统一的业务失败处理，不需要则注释掉即可
      errorHandle(data)
    }
  }else{
    // 处理500、404、403等服务异常
    systemError(status)
  }
  return data
}, error => {
  // 打印错误日志
  printLog('error',error)

  if (error.response) {
    // 请求已发出，但服务器响应的状态码不在 2xx 范围内
    // console.log(error.response.data);
    // console.log(error.response.status);
    // console.log(error.response.headers);
    systemError(error.response.status)
  } else {

    if(error.message.indexOf('timeout') != -1){
      // 请求超时异常处理，该错误码为自定义错误码
      notice({code:602,msg:ErrorCode[602]})
    }else{
      // 处理未知的异常，该错误码为自定义错误码
      notice({code:601,msg:ErrorCode[601]})
    }
  }
  return Promise.reject(error)
})

/**
 * 业务异常处理
 * @param {业务异常信息} data
 */
const errorHandle = data => {
  notice({code: data.code,msg: data.msg})
}

/**
 * 系统异常处理
 * @param {状态码} status
 */
const systemError = status => {
  if(status){
    notice({code: status,msg: ErrorCode[status]})
  }else{
    //未知错误
    notice({code: 601,msg: ErrorCode[601]})
  }
}

/**
 * 错误消息通知
 */
const notice = ({code,msg}) => {
  ViewUI.Notice.error({
    // 通知标题
    title: code+'-'+msg,
    // 通知停留时间
    //duration: 10
  })
}

/**
 * 打印请求日志
 */
const printLog = (name,message) => {
  if(config && config.httpLog){
    console.log(`${name}:`,message)
  }
}

export default instance
